package com.binc.testspring.service;

import com.binc.testspring.dto.Result;
import com.binc.testspring.vo.IdVo;
import com.google.gson.JsonObject;
import com.sun.org.apache.bcel.internal.classfile.Code;
import jdk.nashorn.internal.runtime.JSONFunctions;
import okhttp3.MultipartBody;
import okhttp3.ResponseBody;
import org.springframework.stereotype.Service;
import retrofit2.Call;
import retrofit2.http.*;

import java.util.List;

/**
 *
 */
@Service
// @RetrofitClient(baseUrl = "${test.baseUrl}")
public interface RetrofitAPIService {

    /**
     *   http://localhost:30009/erp.transaction.api/econtract/codeno/binc2
     *
     *      @headers 这是因为erp.transaction.api 有验证这个头部的地方，所以才加了这个，一般来说不用
     *      @headers标注再方法上，能一次设置多个参数；
     *      @header标注在形参前，一次只能添加一个
     * */
    @Headers({
            "Authorization:eyJhbGciOiJSUzI1NiJ9.eyJkdCI6InBjX3dlYiIsInR0IjoiMSIsInN1YiI6IjU3MjYyNTY0MTIzNTI1MTIwMCIsIlVOb25jZSI6ImMwNTFiMGY4LTJiZmItNDMyZS1hOGE0LWFkOGFjNTBiMmJhMiIsInJvbGUiOiI1ODUwMTQ2NDI3MTc5ODI3MjAiLCJpc3MiOiJ5anpmLmNvbSIsImV4cCI6MTYzMDY1NjEwOSwiaWF0IjoxNjMwNDgzMzA5LCJqdGkiOiIyNjFlYjFmZS1jMmM4LTQ4MjctODA2ZC1kZWU3NTVkMTQ3MGQifQ.Cw3qa-nDR9odlcFFoKMKm_fJ4fuY-8xOI70eet0TTj-_UH90W5EvmHG1ZIKnItosgPmJAp9-f_fg4aBNsoZ8GVinpSn3kIGwMSaSqs3z88BDg6eTYDKrfTCAMJlVwB0Brqpqs88PZ6-NCcVDODm4jwYCtz6PEjtqa3fLvimr68w",
            "X-City-Code:450100",
            "X-Organ-Id:552692373611008128"
    }
    )
    @POST("binc2")
    Call<Result<List<String>>> binc2(@Body IdVo idVo);


    /**
     * 返回的是个对象，如果我们就是用个string接受的话会报错，但是用jsonObject对象接收的话就能通过了，然后代码里边就能够直接操作jsonObject对象了
     *
     * @param idVo
     * @return
     */
    @Headers({
            "Authorization:eyJhbGciOiJSUzI1NiJ9.eyJkdCI6InBjX3dlYiIsInR0IjoiMSIsInN1YiI6IjU3MjYyNTY0MTIzNTI1MTIwMCIsIlVOb25jZSI6ImMwNTFiMGY4LTJiZmItNDMyZS1hOGE0LWFkOGFjNTBiMmJhMiIsInJvbGUiOiI1ODUwMTQ2NDI3MTc5ODI3MjAiLCJpc3MiOiJ5anpmLmNvbSIsImV4cCI6MTYzMDY1NjEwOSwiaWF0IjoxNjMwNDgzMzA5LCJqdGkiOiIyNjFlYjFmZS1jMmM4LTQ4MjctODA2ZC1kZWU3NTVkMTQ3MGQifQ.Cw3qa-nDR9odlcFFoKMKm_fJ4fuY-8xOI70eet0TTj-_UH90W5EvmHG1ZIKnItosgPmJAp9-f_fg4aBNsoZ8GVinpSn3kIGwMSaSqs3z88BDg6eTYDKrfTCAMJlVwB0Brqpqs88PZ6-NCcVDODm4jwYCtz6PEjtqa3fLvimr68w",
            "X-City-Code:450100",
            "X-Organ-Id:552692373611008128"
    }
    )
    @POST("binc2")
    Call<JsonObject> binc3(@Body IdVo idVo);

    /**
     * 返回的是个对象，如果我们就是用个string接受的话会报错，但是用jsonObject对象接收的话就能通过了，然后代码里边就能够直接操作jsonObject对象了
     *
     * @header 替代   @headers  !!!!
     */
    // @Headers({
    //         "Authorization:eyJhbGciOiJSUzI1NiJ9.eyJkdCI6InBjX3dlYiIsInR0IjoiMSIsInN1YiI6IjU3MjYyNTY0MTIzNTI1MTIwMCIsIlVOb25jZSI6ImMwNTFiMGY4LTJiZmItNDMyZS1hOGE0LWFkOGFjNTBiMmJhMiIsInJvbGUiOiI1ODUwMTQ2NDI3MTc5ODI3MjAiLCJpc3MiOiJ5anpmLmNvbSIsImV4cCI6MTYzMDY1NjEwOSwiaWF0IjoxNjMwNDgzMzA5LCJqdGkiOiIyNjFlYjFmZS1jMmM4LTQ4MjctODA2ZC1kZWU3NTVkMTQ3MGQifQ.Cw3qa-nDR9odlcFFoKMKm_fJ4fuY-8xOI70eet0TTj-_UH90W5EvmHG1ZIKnItosgPmJAp9-f_fg4aBNsoZ8GVinpSn3kIGwMSaSqs3z88BDg6eTYDKrfTCAMJlVwB0Brqpqs88PZ6-NCcVDODm4jwYCtz6PEjtqa3fLvimr68w",
    //         "X-City-Code:450100",
    //         "X-Organ-Id:552692373611008128"
    // }
    // )
    @POST("binc2")
    Call<JsonObject> binc4(@Header("Authorization") String Authorization,
                           @Header("X-City-Code") String cityCode,
                           @Header("X-Organ-Id") String organId,
                           @Body IdVo idVo);

    /**
     retrofit注解：

     方法注解1，包含@GET、@POST、@PUT、@DELETE、@PATH、@HEAD、@OPTIONS、
     方法注解2：@HTTP。  这个可以替代上边方法注解1的全部

     标记注解，包含@FormUrlEncoded、@Multipart、@Streaming。
     参数注解，包含@Query,@QueryMap、@Body、@Field，@FieldMap、@Part，@PartMap。
     其他注解，@Path、@Header,@Headers、@Url。

     */
//下面是几个特殊注解的使用场景
    /**
     * http注解
     *      method 表示请的方法，不区分大小写
     *      path表示路径
     *      hasBody表示是否有请求体
     */
    @HTTP(method = "post", path = "other/binc1", hasBody = true)
    Call<JsonObject> http_annotation(@Body IdVo idVo);

    /**
     * usrl注解
     * @param url  使用全路径复写baseUrl，适用于非统一baseUrl的场景
     *             ！！！注意： @url要使用全路径，  这个时候@http也好  @post也好@get也好，通通是不能出现path值的，路径值必须全都在@url中！！
     */
    @HTTP(method = "post" , hasBody = true)
    Call<JsonObject> url_annotation(@Url String url,@Body IdVo idVo);


    /**
     * @Streaming:用于下载大文件  这个写了测试代码，但是没有真正的服务端支持
     * @param fileUrl
     * @return
     */
    @Streaming
    @GET
    Call<ResponseBody> downloadFileWithDynamicUrlAsync(@Url String fileUrl);

    @POST("third/binc3")
    Call<JsonObject> binc4();
}